package Utils

import (
	"math"
)

type CommonCompareStruct struct {
	Max1  byte
	Max2  byte
	Min1  byte
	Min2  byte
	Hist1 []int
	Hist2 []int
	Avg1  float64
	Avg2  float64
	Mid1  float64
	Mid2  float64
}

func GetMaxMeanMeidan(img1, img2 []byte) (int, int, float64) {
	imgLen := len(img1)
	detaImg := make([]byte, imgLen)
	count := make([]int, 256)
	for i := 0; i < imgLen; i++ {
		if img1[i] < img2[i] {
			detaImg[i] = img2[i] - img1[i]
		} else {
			detaImg[i] = img1[i] - img2[i]
		}
	}
	max := byte(0)
	mean := float64(0)
	for i := 0; i < imgLen; i++ {
		count[detaImg[i]]++
		if max < detaImg[i] {
			max = detaImg[i]
		}
		mean += float64(detaImg[i])
	}
	mean /= float64(imgLen)
	adder := 0
	median := 0
	for i := 0; i < 255; i++ {
		adder += count[i]
		if adder >= imgLen/2 {
			median = 0
			break
		}
	}
	return int(max), median, mean
}

func CommonCompare(img1, img2 []byte) CommonCompareStruct {
	var ccs = CommonCompareStruct{}
	imgLen := len(img1)
	var max1 byte = 0
	var max2 byte = 0
	var min1 byte = 255
	var min2 byte = 255
	hist1 := make([]int, 256)
	hist2 := make([]int, 256)
	var imgLenF = float64(imgLen)
	var avg1 = 0.0
	var avg2 = 0.0
	var mid1 = 0.0
	var mid2 = 0.0
	for i := 0; i < imgLen; i++ {
		if max1 < img1[i] {
			max1 = img1[i]
		}
		if min1 > img1[i] {
			min1 = img1[i]
		}
		if max2 < img2[i] {
			max2 = img2[i]
		}
		if min2 > img2[i] {
			min2 = img2[i]
		}
		hist1[img1[i]]++
		hist2[img2[i]]++
		avg1 += float64(img1[i]) / imgLenF
		avg2 += float64(img2[i]) / imgLenF
	}
	var half = imgLen / 2
	var count = 0
	for i := 0; i < 255; i++ {
		count += hist1[i]
		if count == half {
			if half*2 == imgLen {
				mid1 = float64(i) + 0.5
			} else {
				mid1 = float64(i)
			}
			break
		} else if count > half {
			mid1 = float64(i)
			break
		}
	}
	count = 0
	for i := 0; i < 255; i++ {
		count += hist2[i]
		if count == half {
			if half*2 == imgLen {
				mid2 = float64(i) + 0.5
			} else {
				mid2 = float64(i)
			}
			break
		} else if count > half {
			mid2 = float64(i)
			break
		}
	}
	ccs.Max1 = max1
	ccs.Max2 = max2
	ccs.Min1 = min1
	ccs.Min2 = min2
	ccs.Hist1 = hist1
	ccs.Hist2 = hist2
	ccs.Avg1 = avg1
	ccs.Avg2 = avg2
	ccs.Mid1 = mid1
	ccs.Mid2 = mid2
	return ccs
}

func Bytes2Float64(img []byte) []float64 {
	imgLen := len(img)
	ret := make([]float64, imgLen)
	for i := 0; i < imgLen; i++ {
		ret[i] = float64(img[i])
	}
	return ret
}

// https://zhuanlan.zhihu.com/p/402013872

// mse rmse psnr ssim uqi ms-ssim ergas scc rase sam vifp

func MSE(img1, img2 []float64) float64 {
	var ret float64 = 0
	var avg float64 = 1 / float64(len(img1))
	for i := 0; i < len(img1); i++ {
		ret += avg * math.Pow(math.Abs(img1[i]-img2[i]), 2)
	}
	return ret
}

func RMSE(img1, img2 []float64) float64 {
	return math.Sqrt(MSE(img1, img2))
}

// https://baike.baidu.com/item/psnr/2925132?fr=aladdin
func PSNR(img1, img2 []float64) float64 {
	mse := MSE(img1, img2)
	if mse == 0 {
		return math.MaxFloat64
	} else {
		max := math.Pow(2, 16)
		return 10 * math.Log10(max/mse)
	}
}

// https://baike.baidu.com/item/SSIM/2091025?fr=aladdin
func SSIM(img1, img2 []float64) float64 {
	k1 := 0.01
	k2 := 0.03
	L := float64(255)

	c1 := math.Pow(k1*L, 2)
	c2 := math.Pow(k2*L, 2)

	var len1 float64 = float64(len(img1))
	// var len2 float64 = float64(len(img2))
	var u1 float64 = 0
	var u2 float64 = 0
	for i := 0; i < len(img1); i++ {
		u1 += img1[i]
		u2 += img2[i]
	}
	u1 = u1 / len1
	u2 = u2 / len1

	var o12 float64 = 0
	var o1 float64 = 0
	var o2 float64 = 0
	for i := 0; i < len(img1); i++ {
		i1 := img1[i]
		i2 := img2[i]
		o12 += (i1 - u1) * (i2 - u2)
		o1 += math.Pow(u1-i1, 2)
		o2 += math.Pow(u2-i2, 2)
	}
	o12 = o12 / len1
	o1 = o1 / (len1 - 1)
	o2 = o2 / (len1 - 1)
	return (2 * math.Sqrt(u1) * math.Sqrt(u2)) * (2*o12 + c2) / (u1 + u2 + c1) / (o1 + o2 + c2)
}

func filter2(img []float64, win [][]float64, width, height int) []float64 {
	var ret = make([]float64, len(img))
	var winlen = len(win[0]) / 2
	for i := 0; i < width; i++ {
		for j := 0; j < height; j++ {
			for ii := i - winlen; ii < winlen+1; ii++ {
				for jj := j - winlen; jj < winlen+1; jj++ {
					if ii >= 0 && jj >= 0 && ii < width && jj < height {
						ret[jj*width+ii] = win[jj+winlen][ii+winlen] * img[i+j*width]
					}
				}
			}
		}
	}
	return ret
}
func MSSSIM(img1f, img2f []float64, width, height int) float64 {
	weights := []float64{
		0.0448, 0.2856, 0.3001, 0.2363, 0.1333,
	}
	// var ws float64 = 11
	k1 := 0.01
	k2 := 0.03
	L := float64(255)
	c1 := math.Pow(k1*L, 2)
	c2 := math.Pow(k2*L, 2)

	/*
		ws = 11
		x, y = np.mgrid[-ws//2 + 1:ws//2 + 1, -ws//2 + 1:ws//2 + 1]
		g = np.exp(-((x**2 + y**2)/(2.0*1.5**2)))
		g[ g < np.finfo(g.dtype).eps*g.max() ] = 0
		assert g.shape == (ws,ws)
		den = g.sum()
		if den !=0:
		    g/=den
		win = np.rot90(g,2)
	*/
	win := [][]float64{
		{
			1.0575655981532615e-06,
			7.814411533053598e-06,
			3.702247708274888e-05,
			0.00011246435511667898,
			0.00021905065286601734,
			0.00027356116008580585,
			0.00021905065286601734,
			0.00011246435511667898,
			3.702247708274888e-05,
			7.814411533053598e-06,
			1.0575655981532615e-06,
		},
		{
			7.814411533053598e-06,
			5.774112519786371e-05,
			0.00027356116008580585,
			0.0008310054290871993,
			0.001618577562534386,
			0.0020213587583625676,
			0.001618577562534386,
			0.0008310054290871993,
			0.00027356116008580585,
			5.774112519786371e-05,
			7.814411533053598e-06,
		},
		{
			3.702247708274888e-05,
			0.00027356116008580585,
			0.0012960555938432016,
			0.003937069262846786,
			0.007668363825236722,
			0.009576627490240295,
			0.007668363825236722,
			0.003937069262846786,
			0.0012960555938432016,
			0.00027356116008580585,
			3.702247708274888e-05,
		},
		{
			0.00011246435511667898,
			0.0008310054290871993,
			0.003937069262846786,
			0.011959760410037011,
			0.02329443247348711,
			0.02909122564855044,
			0.02329443247348711,
			0.011959760410037011,
			0.003937069262846786,
			0.0008310054290871993,
			0.00011246435511667898,
		},
		{
			0.00021905065286601734,
			0.001618577562534386,
			0.007668363825236722,
			0.02329443247348711,
			0.04537135909566033,
			0.05666197049168458,
			0.04537135909566033,
			0.02329443247348711,
			0.007668363825236722,
			0.001618577562534386,
			0.00021905065286601734,
		},
		{
			0.00027356116008580585,
			0.0020213587583625676,
			0.009576627490240295,
			0.02909122564855044,
			0.05666197049168458,
			0.07076223776394698,
			0.05666197049168458,
			0.02909122564855044,
			0.009576627490240295,
			0.0020213587583625676,
			0.00027356116008580585,
		},
		{
			0.00021905065286601734,
			0.001618577562534386,
			0.007668363825236722,
			0.02329443247348711,
			0.04537135909566033,
			0.05666197049168458,
			0.04537135909566033,
			0.02329443247348711,
			0.007668363825236722,
			0.001618577562534386,
			0.00021905065286601734,
		},
		{
			0.00011246435511667898,
			0.0008310054290871993,
			0.003937069262846786,
			0.011959760410037011,
			0.02329443247348711,
			0.02909122564855044,
			0.02329443247348711,
			0.011959760410037011,
			0.003937069262846786,
			0.0008310054290871993,
			0.00011246435511667898,
		},
		{
			3.702247708274888e-05,
			0.00027356116008580585,
			0.0012960555938432016,
			0.003937069262846786,
			0.007668363825236722,
			0.009576627490240295,
			0.007668363825236722,
			0.003937069262846786,
			0.0012960555938432016,
			0.00027356116008580585,
			3.702247708274888e-05,
		},
		{
			7.814411533053598e-06,
			5.774112519786371e-05,
			0.00027356116008580585,
			0.0008310054290871993,
			0.001618577562534386,
			0.0020213587583625676,
			0.001618577562534386,
			0.0008310054290871993,
			0.00027356116008580585,
			5.774112519786371e-05,
			7.814411533053598e-06,
		},
		{
			1.0575655981532615e-06,
			7.814411533053598e-06,
			3.702247708274888e-05,
			0.00011246435511667898,
			0.00021905065286601734,
			0.00027356116008580585,
			0.00021905065286601734,
			0.00011246435511667898,
			3.702247708274888e-05,
			7.814411533053598e-06,
			1.0575655981532615e-06,
		},
	}
	// filter2(img,win,mode='same')

	ssim := func(img1, img2 []float64, width, height int) (float64, float64) {
		mu1 := filter2(img1, win, width, height)
		mu2 := filter2(img2, win, width, height)
		img1_sum_sq := make([]float64, width*height)
		img2_sum_sq := make([]float64, width*height)
		img1_img2_sum_mul := make([]float64, width*height)
		sigmaImg1_sq := make([]float64, width*height)   // img1 * img1
		sigmaImg2_sq := make([]float64, width*height)   // img2 * img2
		sigmaImg1_Img2 := make([]float64, width*height) // img1 * img2
		for i := 0; i < len(img1); i++ {
			img1_sum_sq[i] = mu1[i] * mu1[i]
			img2_sum_sq[i] = mu2[i] * mu2[i]
			img1_img2_sum_mul[i] = mu1[i] * mu2[i]

			sigmaImg1_sq[i] = math.Pow(img1f[i], 2)
			sigmaImg2_sq[i] = math.Pow(img2f[i], 2)
			sigmaImg1_Img2[i] = img1f[i] * img2f[i]
		}
		sigmaImg1_sq = filter2(sigmaImg1_sq, win, width, height)
		sigmaImg2_sq = filter2(sigmaImg2_sq, win, width, height)
		sigmaImg1_Img2 = filter2(sigmaImg1_Img2, win, width, height)
		ssim_map := 0.0
		cs_map := 0.0
		for i := 0; i < len(img1); i++ {
			sigmaImg1_sq[i] -= img1_sum_sq[i]
			sigmaImg2_sq[i] -= img2_sum_sq[i]
			sigmaImg1_Img2[i] -= img1_img2_sum_mul[i]
			ssim_map += ((2*img1_img2_sum_mul[i] + c1) * (2*sigmaImg1_Img2[i] + c2)) / ((img1_sum_sq[i] + img2_sum_sq[i] + c1) * (sigmaImg1_sq[i] + sigmaImg2_sq[i] + c2))
			cs_map += (2*sigmaImg1_sq[i] + c2) / (sigmaImg1_sq[i] + sigmaImg2_sq[i] + c2)
			//ssim_map = ((2*img1_img2_sum_mul + C1)*(2*sigmaImg1_Img2 + C2))/((img1_sum_sq + img2_sum_sq + C1)*(sigmaImg1_sq + sigmaImg2_sq + C2))
			//cs_map = (2*sigmaImg1_sq + C2)/(sigmaImg1_sq + sigmaImg2_sq + C2)
		}
		ssim_map = ssim_map / float64(len(img1))
		cs_map = cs_map / float64(len(img1))
		return ssim_map, cs_map
	}
	// uniform_filter(im, 2)[::2,::2]
	uniform_filter := func(img []float64, width, height int) ([]float64, int, int) {
		ret := make([]float64, width*height)
		for i := 0; i < width; i++ {
			ret[i] = img[i]
		}
		for j := 1; j < height; j++ {
			for i := 0; i < width; i++ {
				ret[i] = math.Floor((img[i+j*width] + img[i+j*width-width]) / 2)
			}
		}
		for i := 1; i < width; i++ {
			for j := 0; j < height; j++ {
				ret[i] = math.Floor((img[i+j*width] + img[i+j*width-1]) / 2)
			}
		}
		width_t := int(math.Ceil(float64(width) / 2))
		height_t := int(math.Ceil(float64(height) / 2))
		ret_t := make([]float64, width_t*height_t)
		ind := 0
		for j := 0; j < height; j += 2 {
			for i := 0; i < width; i += 2 {
				ret_t[ind] = ret[i+j*width]
				ind++
			}
		}
		return ret_t, width_t, height_t
	}

	width_t := width
	height_t := height
	ret := 1.0
	for i := 0; i < len(weights); i++ {
		mssim_, msc_ := ssim(img1f, img2f, width_t, height_t)
		img1f, _, _ = uniform_filter(img1f, width_t, height_t)
		img2f, width_t, height_t = uniform_filter(img2f, width_t, height_t)
		ret *= math.Pow(mssim_, weights[i]) * math.Pow(msc_, weights[i])
	}
	return ret
}

//func ERGAS(img1,img2 []float64)  {
//
//}

//func SCC()  {
//
//}
//
//func RASE()  {
//
//}

func SAM(img1, img2 []float64) float64 {
	ret := 0.0
	imgLen := len(img1)
	norm1 := 0.0
	norm2 := 0.0
	dot := 0.0
	for i := 0; i < imgLen; i++ {
		dot += img1[i] * img2[i]
		norm1 += math.Pow(img1[i], 2)
		norm2 += math.Pow(img2[i], 2)
	}
	ret = math.Acos(dot / norm1 / norm2)
	if ret < -1 {
		ret = -1
	} else if ret > 1 {
		ret = 1
	}
	return ret
}

//func VIFP(img1,img2 []float64) float64  {
//	sigma_nsq := 2
//	ESP := 1E-10
//	num := 0.0
//	den := 0.0
//	N := []float64{17,9,5,3}
//	win := map[int] [][]float64 {
//		1: {
//			{
//				5.559594592783044e-05,
//				0.00010636740765673819,
//				0.00018664024641679638,
//				0.00030035391460946103,
//				0.0004432947289079993,
//				0.0006000440188019737,
//				0.0007449119272788747,
//				0.0008481213936542954,
//				0.0008856097347475977,
//				0.0008481213936542954,
//				0.0007449119272788747,
//				0.0006000440188019737,
//				0.0004432947289079993,
//				0.00030035391460946103,
//				0.00018664024641679638,
//				0.00010636740765673819,
//				5.559594592783044e-05,
//			},
//			{
//				0.00010636740765673819,
//				0.00020350450420074796,
//				0.0003570842953466439,
//				0.0005746438295704774,
//				0.0008481213936542954,
//				0.0011480176421991084,
//				0.0014251821659819106,
//				0.001622644826267242,
//				0.0016943683592137333,
//				0.001622644826267242,
//				0.0014251821659819106,
//				0.0011480176421991084,
//				0.0008481213936542954,
//				0.0005746438295704774,
//				0.0003570842953466439,
//				0.00020350450420074796,
//				0.00010636740765673819,
//			},
//			{
//				0.00018664024641679638,
//				0.0003570842953466439,
//				0.0006265669375918438,
//				0.001008313244777393,
//				0.0014881775290964026,
//				0.0020143980223936357,
//				0.0025007317232558024,
//				0.002847214545256171,
//				0.002973066045804314,
//				0.002847214545256171,
//				0.0025007317232558024,
//				0.0020143980223936357,
//				0.0014881775290964026,
//				0.001008313244777393,
//				0.0006265669375918438,
//				0.0003570842953466439,
//				0.00018664024641679638,
//			},
//			{
//				0.00030035391460946103,
//				0.0005746438295704774,
//				0.001008313244777393,
//				0.001622644826267242,
//				0.002394874391130864,
//				0.0032417034547648164,
//				0.004024344035587113,
//				0.004581927268200005,
//				0.004784455884480848,
//				0.004581927268200005,
//				0.004024344035587113,
//				0.0032417034547648164,
//				0.002394874391130864,
//				0.001622644826267242,
//				0.001008313244777393,
//				0.0005746438295704774,
//				0.00030035391460946103,
//			},
//			{
//				0.0004432947289079993,
//				0.0008481213936542954,
//				0.0014881775290964026,
//				0.002394874391130864,
//				0.0035346141413387963,
//				0.004784455884480848,
//				0.005939561335858544,
//				0.00676250285891533,
//				0.007061416452790294,
//				0.00676250285891533,
//				0.005939561335858544,
//				0.004784455884480848,
//				0.0035346141413387963,
//				0.002394874391130864,
//				0.0014881775290964026,
//				0.0008481213936542954,
//				0.0004432947289079993,
//			},
//			{
//				0.0006000440188019737,
//				0.0011480176421991084,
//				0.0020143980223936357,
//				0.0032417034547648164,
//				0.004784455884480848,
//				0.006476242439824857,
//				0.008039793892133213,
//				0.009153728045941962,
//				0.009558337671202134,
//				0.009153728045941962,
//				0.008039793892133213,
//				0.006476242439824857,
//				0.004784455884480848,
//				0.0032417034547648164,
//				0.0020143980223936357,
//				0.0011480176421991084,
//				0.0006000440188019737,
//			},
//			{
//				0.0007449119272788747,
//				0.0014251821659819106,
//				0.0025007317232558024,
//				0.004024344035587113,
//				0.005939561335858544,
//				0.008039793892133213,
//				0.009980831698099707,
//				0.01136370163992856,
//				0.01186599568220549,
//				0.01136370163992856,
//				0.009980831698099707,
//				0.008039793892133213,
//				0.005939561335858544,
//				0.004024344035587113,
//				0.0025007317232558024,
//				0.0014251821659819106,
//				0.0007449119272788747,
//			},
//			{
//				0.0008481213936542954,
//				0.001622644826267242,
//				0.002847214545256171,
//				0.004581927268200005,
//				0.00676250285891533,
//				0.009153728045941962,
//				0.01136370163992856,
//				0.012938171774392448,
//				0.013510059950107848,
//				0.012938171774392448,
//				0.01136370163992856,
//				0.009153728045941962,
//				0.00676250285891533,
//				0.004581927268200005,
//				0.002847214545256171,
//				0.001622644826267242,
//				0.0008481213936542954,
//			},
//			{
//				0.0008856097347475977,
//				0.0016943683592137333,
//				0.002973066045804314,
//				0.004784455884480848,
//				0.007061416452790294,
//				0.009558337671202134,
//				0.01186599568220549,
//				0.013510059950107848,
//				0.014107226510685198,
//				0.013510059950107848,
//				0.01186599568220549,
//				0.009558337671202134,
//				0.007061416452790294,
//				0.004784455884480848,
//				0.002973066045804314,
//				0.0016943683592137333,
//				0.0008856097347475977,
//			},
//			{
//				0.0008481213936542954,
//				0.001622644826267242,
//				0.002847214545256171,
//				0.004581927268200005,
//				0.00676250285891533,
//				0.009153728045941962,
//				0.01136370163992856,
//				0.012938171774392448,
//				0.013510059950107848,
//				0.012938171774392448,
//				0.01136370163992856,
//				0.009153728045941962,
//				0.00676250285891533,
//				0.004581927268200005,
//				0.002847214545256171,
//				0.001622644826267242,
//				0.0008481213936542954,
//			},
//			{
//				0.0007449119272788747,
//				0.0014251821659819106,
//				0.0025007317232558024,
//				0.004024344035587113,
//				0.005939561335858544,
//				0.008039793892133213,
//				0.009980831698099707,
//				0.01136370163992856,
//				0.01186599568220549,
//				0.01136370163992856,
//				0.009980831698099707,
//				0.008039793892133213,
//				0.005939561335858544,
//				0.004024344035587113,
//				0.0025007317232558024,
//				0.0014251821659819106,
//				0.0007449119272788747,
//			},
//			{
//				0.0006000440188019737,
//				0.0011480176421991084,
//				0.0020143980223936357,
//				0.0032417034547648164,
//				0.004784455884480848,
//				0.006476242439824857,
//				0.008039793892133213,
//				0.009153728045941962,
//				0.009558337671202134,
//				0.009153728045941962,
//				0.008039793892133213,
//				0.006476242439824857,
//				0.004784455884480848,
//				0.0032417034547648164,
//				0.0020143980223936357,
//				0.0011480176421991084,
//				0.0006000440188019737,
//			},
//			{
//				0.0004432947289079993,
//				0.0008481213936542954,
//				0.0014881775290964026,
//				0.002394874391130864,
//				0.0035346141413387963,
//				0.004784455884480848,
//				0.005939561335858544,
//				0.00676250285891533,
//				0.007061416452790294,
//				0.00676250285891533,
//				0.005939561335858544,
//				0.004784455884480848,
//				0.0035346141413387963,
//				0.002394874391130864,
//				0.0014881775290964026,
//				0.0008481213936542954,
//				0.0004432947289079993,
//			},
//			{
//				0.00030035391460946103,
//				0.0005746438295704774,
//				0.001008313244777393,
//				0.001622644826267242,
//				0.002394874391130864,
//				0.0032417034547648164,
//				0.004024344035587113,
//				0.004581927268200005,
//				0.004784455884480848,
//				0.004581927268200005,
//				0.004024344035587113,
//				0.0032417034547648164,
//				0.002394874391130864,
//				0.001622644826267242,
//				0.001008313244777393,
//				0.0005746438295704774,
//				0.00030035391460946103,
//			},
//			{
//				0.00018664024641679638,
//				0.0003570842953466439,
//				0.0006265669375918438,
//				0.001008313244777393,
//				0.0014881775290964026,
//				0.0020143980223936357,
//				0.0025007317232558024,
//				0.002847214545256171,
//				0.002973066045804314,
//				0.002847214545256171,
//				0.0025007317232558024,
//				0.0020143980223936357,
//				0.0014881775290964026,
//				0.001008313244777393,
//				0.0006265669375918438,
//				0.0003570842953466439,
//				0.00018664024641679638,
//			},
//			{
//				0.00010636740765673819,
//				0.00020350450420074796,
//				0.0003570842953466439,
//				0.0005746438295704774,
//				0.0008481213936542954,
//				0.0011480176421991084,
//				0.0014251821659819106,
//				0.001622644826267242,
//				0.0016943683592137333,
//				0.001622644826267242,
//				0.0014251821659819106,
//				0.0011480176421991084,
//				0.0008481213936542954,
//				0.0005746438295704774,
//				0.0003570842953466439,
//				0.00020350450420074796,
//				0.00010636740765673819,
//			},
//			{
//				5.559594592783044e-05,
//				0.00010636740765673819,
//				0.00018664024641679638,
//				0.00030035391460946103,
//				0.0004432947289079993,
//				0.0006000440188019737,
//				0.0007449119272788747,
//				0.0008481213936542954,
//				0.0008856097347475977,
//				0.0008481213936542954,
//				0.0007449119272788747,
//				0.0006000440188019737,
//				0.0004432947289079993,
//				0.00030035391460946103,
//				0.00018664024641679638,
//				0.00010636740765673819,
//				5.559594592783044e-05,
//			},
//		},
//		2: {
//			{
//				0.0003601676510760707,
//				0.0010608402206008477,
//				0.002294847042974415,
//				0.003645994458290197,
//				0.004254384694656206,
//				0.003645994458290197,
//				0.002294847042974415,
//				0.0010608402206008477,
//				0.0003601676510760707,
//			},
//			{
//				0.0010608402206008477,
//				0.0031246059169449517,
//				0.006759257906812958,
//				0.010738936586576238,
//				0.01253089327849359,
//				0.010738936586576238,
//				0.006759257906812958,
//				0.0031246059169449517,
//				0.0010608402206008477,
//			},
//			{
//				0.002294847042974415,
//				0.006759257906812958,
//				0.014621865497676587,
//				0.02323084701335705,
//				0.027107271036246768,
//				0.02323084701335705,
//				0.014621865497676587,
//				0.006759257906812958,
//				0.002294847042974415,
//			},
//			{
//				0.003645994458290197,
//				0.010738936586576238,
//				0.02323084701335705,
//				0.0369085772977295,
//				0.0430673409280585,
//				0.0369085772977295,
//				0.02323084701335705,
//				0.010738936586576238,
//				0.003645994458290197,
//			},
//			{
//				0.004254384694656206,
//				0.01253089327849359,
//				0.027107271036246768,
//				0.0430673409280585,
//				0.05025378896757758,
//				0.0430673409280585,
//				0.027107271036246768,
//				0.01253089327849359,
//				0.004254384694656206,
//			},
//			{
//				0.003645994458290197,
//				0.010738936586576238,
//				0.02323084701335705,
//				0.0369085772977295,
//				0.0430673409280585,
//				0.0369085772977295,
//				0.02323084701335705,
//				0.010738936586576238,
//				0.003645994458290197,
//			},
//			{
//				0.002294847042974415,
//				0.006759257906812958,
//				0.014621865497676587,
//				0.02323084701335705,
//				0.027107271036246768,
//				0.02323084701335705,
//				0.014621865497676587,
//				0.006759257906812958,
//				0.002294847042974415,
//			},
//			{
//				0.0010608402206008477,
//				0.0031246059169449517,
//				0.006759257906812958,
//				0.010738936586576238,
//				0.01253089327849359,
//				0.010738936586576238,
//				0.006759257906812958,
//				0.0031246059169449517,
//				0.0010608402206008477,
//			},
//			{
//				0.0003601676510760707,
//				0.0010608402206008477,
//				0.002294847042974415,
//				0.003645994458290197,
//				0.004254384694656206,
//				0.003645994458290197,
//				0.002294847042974415,
//				0.0010608402206008477,
//				0.0003601676510760707,
//			},
//		},
//		3: {
//			{
//				0.05458563783624111,
//				0.1192259944208055,
//				0.05458563783624111,
//				0.005238424603051678,
//			},
//			{
//				0.1192259944208055,
//				0.26041351368422166,
//				0.1192259944208055,
//				0.01144177126538195,
//			},
//			{
//				0.05458563783624111,
//				0.1192259944208055,
//				0.05458563783624111,
//				0.005238424603051678,
//			},
//			{
//				0.005238424603051678,
//				0.01144177126538195,
//				0.005238424603051678,
//				0.0005027163446212974,
//			},
//		},
//		4: {
//			{
//				0.027681808779465796,
//				0.11101489301099086,
//				0.027681808779465796,
//			},
//			{
//				0.11101489301099086,
//				0.4452131928381734,
//				0.11101489301099086,
//			},
//			{
//				0.027681808779465796,
//				0.11101489301099086,
//				0.027681808779465796,
//			},
//		},
//	}
//	for scale := 1;scale < 5;scale++ {
//		N := math.Pow(2.0,(4 - float64(scale) + 1)) + 1
//	}
//}
